home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Internet Info 1994 March
/
Internet Info CD-ROM (Walnut Creek) (March 1994).iso
/
answers
/
comp
/
vxworks-faq
< prev
next >
Wrap
Text File
|
1994-03-16
|
70KB
|
1,906 lines
Newsgroups: comp.os.vxworks,comp.answers,news.answers
Path: bloom-beacon.mit.edu!hookup!swrinde!ihnp4.ucsd.edu!library.ucla.edu!csulb.edu!csus.edu!netcom.com!hjb
From: hjb@netcom.com (squeedy)
Subject: comp.os.vxworks Frequently Asked Questions (FAQ) [LONG]
Message-ID: <hjbCMstAs.7w3@netcom.com>
Followup-To: comp.os.vxworks
Summary: This posting contains a list of Frequently Asked
Questions (and their answers) about VxWorks REALTIME
Operating System. It should be read by anyone who wishes to
post to the comp.os.vxworks newsgroup.
Keywords: vxworks,realtime,faq,kernel,tcp-ip,networking,vme,embedded
Sender: hjb@netcom.com (squeedy)
Reply-To: hjb@netcom.com
Organization: PEACEFUL STAR, Oakland, CA
Date: Thu, 17 Mar 1994 07:40:03 GMT
Approved: news-answers-request@MIT.Edu
Lines: 1886
Xref: bloom-beacon.mit.edu comp.os.vxworks:2443 comp.answers:4197 news.answers:16479
Archive-name: vxworks-faq
Maintained-by: hjb@netcom.com
Last-modified: March 15, 1994
Version: 1.4
This is the list of frequently asked questions (and their answers) for
the newsgroup comp.os.vxworks.
Where possible, pointers to existing information are included here, rather
than rehashing that information again.
If you haven't already done so, now is as good a time as any to read the
guide to Net etiquette which is posted to news.annouce.newusers regularly.
You should be familiar with acronyms like FAQ, FTP and IMHO, as well as know
about smileys, followups and when to reply by email to postings.
The FAQ is currently posted to comp.os.vxworks, news.answers and
comp.answers on the 15th of every month.
This FAQ was compiled by hjb@netcom.com using comments by readers of
comp.os.vxworks as well as his own limited knowledge of VxWorks. Credits
appear at the end. Comments and indications of doubt are enclosed in []s in
the text. Each section begins with dashes ("-") on a line of their own,
then the section number. This should make searching for a specific section
easy.
This FAQ is also available via anonymous ftp in:
rtfm.mit.edu:/pub/usenet/news.answers/vxworks-faq.Z
ftp.uu.net:/usenet/news.answers/vxworks-faq.Z
cs.toronto.edu:/pub/usenet/comp.answers/vxworks-faq.Z
netcom.com:/pub/hjb/vxfaq
-------------------------------------------------------------------------
TABLE OF CONTENTS
1. What is VxWorks?
2. Brief History of VxWorks
3. What are some of the major features of VxWorks?
4. What are the Latest versions of VxWorks?
5. Where is the archive site for user-contributed code?
6. What application notes are available from Wind River?
7. How can I join the VxWorks user's group?
8. Is comp.os.vxworks also available via a mailing list?
9. Can I use gcc or g++ with VxWorks?
10. Other C/C++ Compiler tools for VxWorks?
11. Which cross-debuggers can I use with VxWorks?
12. What are differences between UNIX and VxWorks?
13. What are the performance/benchmark numbers for WIND kernel?
14. What are the performance/benchmark numbers for VxWorks TCP/IP?
15. What is the VxSim VxWorks Simulator?
16. Can I use one boot EPROM for multiple boards on the same net?
17. What's the deal with 68881 FPU code in interrupt handlers?
18. Why does ls() not work on netDrv devices?
19. Why can't I do ".." at top level directories or NFS mount points?
20. Why do I have trouble using relative symbolic links with NFS?
21. X for VxWorks
22. IEEE-488 (GPIB) driver for VxWorks
23. How does one disable NFS client caching?
24. Why doing a lot of slipInit()/slipDelete() cause routing
table corruption?
25. How does one get better network I/O performance?
26. How does one troubleshoot a backplane driver malfunction?
27. How do I add select support to my driver?
28. bind() gets EADDRINUSE, how do I fix it?
29. Common errors in interrupt handlers with floating point
co-proc hardware
30. Finding entry point of a given module using its name
31. The problem with irint() in earlier (5.0.2 ?) releases
32. What are +T, +I thingies in the "i" output?
33. Gotchas w.r.t watchdogs
34. Is it possible to delete a memory partition in VxWorks?
35. rename() does not work in netDrv and nfsDrv filesystems, why?
36. Free NFS Server for VxWorks
37. Free SNMP for VxWorks
38. What third party products are available for VxWorks?
39. What kind of products have been developed using VxWorks?
40. A complete list of CPU hardware supported by VxWorks
41. A complete list of peripheral devices supported by VxWorks
42. What's with these unbundled "accessories"?
43. How come my 5.0.2 BSP isn't available in 5.1, damn it?
44. How much is VxWorks?
45. What is MicroWorks?
46. Other Unbundled Products for VxWorks?
47. How can I find out more about VxWorks?
48. What other net.resources are available on real-time systems?
49. How do i use FIONBIO in 5.0.2 when there is no fcntl()?
50. Free lex and yacc for use with VxWorks
51. timer_gettime() bug
52. bogus INCLUDE_TCP_DEBUG
53. free ppp for VxWorks
54. how to disable cache on mc68040 or mc68030 using TT regs?
55. work-arounds for ms-dos filesystem bug when lseek() past eof
56. TCL for VxWorks
57. adding default route
58. adjusting network driver MTU size
[new] 59. tcpdump like utility for vxworks
[new] 60. VxWorks performance on i960 -- unofficial benchmark
[new] 61. VxWorks SCSI Performance -- unofficial benchmark
9999. Contributions to comp.os.vxworks FAQs.
-------------------------------------------------------------------------
1. What is VxWorks?
VxWorks, from Wind River Systems, is a networked real-time operating
system designed to be used in a distributed environment. It runs on a
wide variety of hardware, including MC680x0, MC683xx, Intel i960, Intel
i386, R3000, SPARC, Fujitsu SPARClite, and TRON Gmicro, based systems.
It requires a host workstation for program development; supported host
platforms include Sun3, Sun4, HP9000, IBM RS-6000, DEC, SGI, and MIPS.
It does not run development systems software such as compiler, linker
and editor on the target machine. The development environment is based
on cross-development or remote-development method. You will need a
UNIX machine of some sort (e.g. SUN's) to run the compilers and
debuggers. The compiled application code can be downloaded to the
target and runs as part of the VxWorks image. During the development
phase or thereafter, individual object code (.o files) can be
downloaded dynamically to running target system. Finished applications
can be ROM'ed or whatever.
----------------------------
2. Brief History of VxWorks
Based on what I have heard from David Wilner and others, WRS was
started by Jerry Fiddler and David Wilner in Jerry's garage as a
contract/consultant shop for realtime, embedded systems and other fun
things. Francis Coppola was one of the earlier customers.
They wrote a bunch of neat programs for their work and found that they
liked them a great deal themselves, and added more excellent features
to the system, eventually adding some things unheard of in
embedded/realtime market in those days such TCP/IP networking. And
continued to pioneer in this area by adding NFS, etc.
VxWorks was the name given the collection of software which ran on
top of various realtime kernels including VRTX and pSOS as well an
earlier slower version of WIND kernel. [ editorial:
VxWorks no longer runs on other kernels; it now runs exclusively on
its own WIND kernel since the 5.0 release, for which the WIND was
rewritten by John Fogelin. ]
They got more people interested in the system and became successful.
And moved from a little building in Emeryville to a larger one. And
eventually to the present site in Alameda. And hired a lot of people.
WRS sold many many more copies of this system and continues to grow
like a real successful company.
-----------------------------
3. What are some of the major features of VxWorks?
In Version 5.1:
- wind kernel unlimited tasks
- 256 priorities
- binary, counting mutex semaphores
- message q's
- POSIX pipes
- sockets
- shared memory
- profiling utilities
- ethernet support (i596, LANCE, NIC, SONIC)
- SLIP (no PPP yet)
- backplane driver for network
- rlogin (server & client)
- telnet (server only)
- rpc (no rpcgen)
- nfs (client)
- ftp (server & client)
- tftp (client & server)
- rsh
- bootp
- proxyarp
- C-interpreter shell (incomplete but useful)
- symbolic debugging
- disassembly
- performmance monitoring tools
- exception handling
- signal handling (not quite unix compatible)
- dynamic object image loader
- system symbol table
- system info utilities
- libraries of 600+ utility routines
- remote source level debugger(VxGDB)
- SCSI support
- DOS & RT11 & Raw filesystems.
- "full ANSI"
- "POSIX I/O"
It is a good idea to get a copy of VxWorks manuals before purchasing
the system. WRS can provide you with such documentation. As far as I
know there is no "VxBook" in the bookstores.
----------------------------
4. What are the Latest versions of VxWorks?
As as of June 1993,
5.0.3.: TRON will be discontinued.
5.0.3 : i386
5.0.5 : r3000
5.1 : 680x0, 683xx, i960, SPARC
i386 and r3000 will be upgraded to 5.1.
------------------------------
5. Where is the archive site for user-contributed code?
The VxWorks archive system is available for FTP as thor.atd.ucar.edu.
It is also accessible via email server at vxworks_archive@ncar.ucar.edu.
Questions should be directed to its maintainer, Richard Neitzel
<thor@thor.ucar.edu>.
To get more detailed infomation send email to:
vxworks_archive@ncar.ucar.edu
The message body must read:
send index
send index from vx
send index from unix
A summary of the archives is periodically posted to comp.os.vxworks.
Some of the usual titles available:
ansi, ansilib, benchmarks, bitcnt, c++builtin, c++headers, camaclib, cbench
cntsem_class, crc, deadman, dhrystones, dirlib, dt1451, fcompress
flags_class, force, gcc+68040, getdate, hkv30extintutil, ivecalloc, joblib2
lclflag, libX11, loadmeter, math, monitor, msgque_class, ntpvx, ping, pipe
poolLib, ring, semCnt, ss1, stevie, string, syslog, task_class, taskmon, tod
tp41, ty335, veclist, vtape, vwcurses, vx_cplusplus, vxrsh, wdog_class, shar
vxtool, vxview, xc
------------------------------
6. What application notes are available from Wind River?
List of Wind Technical Notes
Motorola MV147 Slave Base Control 9-1
System hang during lkup( ) output 10-1
Reserving Memory 11-1
Serial IO Vanishing 13-1
NFS: problems with writing files 14-1
Which interrupts does VxWorks use? 15-1
Debugging ftp problems 18-1
Interrupt handlers, floating point 19-1
Booting From a Memory Board 22-1
Changing Network Interfaces 23-1
Writing Non-buffered Sockets 24-1
RPC and VxWorks 25-1
Using SCSI devices with VxWorks 5.x 26-1
The Select Facility in VxWorks 28-1
Using on-board Serial Ports 29-1
Problems with ls() 30-1
SCSI 31-1
Trouble Shooting Booting Problems 32-1
-----------------------------
7. How can I join the VxWorks user's group?
For User Group info contact WRS or Eric Rabinowitz of Panoramic Systems at:
elr@netcom.com or ericr@wrs.com
phone: 408-429-0598
------------------------------
8. Is comp.os.vxworks also available via a mailing list?
Lawrence Berkeley Labs maintains an automated mailing list which is
bi-directionally gatewayed to comp.os.vxworks
It is called the 'VxWorks Exploder'.
Mail to vxwexplo@lbl.gov is automatically mailed to a number
of sites, including Wind River.
Send subscription request to vxwexplo-request@lbl.gov.
------------------------------
9. Can I use gcc or g++ with VxWorks?
WRS's gcc GNU Toolkit distribution can be reshipped in its entirety.
WRS charges are for media and support, so obviously copies thereof
don't matter to them.
Lots of customers use g++ as provided by the "net" --
see the VxWorks Archive information below.
You can get a generic freely distributable GCC/G++ and compile your
code for VxWorks. Or you can just get a copy from someone who has a
working GCC cross-development setup from WRS.
WRS worked with Cygnus to polish up their release of GCC but a generic
GCC distribution works just fine as well.
For MC68K targets:
You can also use native SunOS 4.X cc running on Sun-3's.
You can also use various other free m68k C compilers
such as lcc, sozobon, etc. provided that you're willing
to hack on them.
Richard Neitzel (thor@thor.atd.ucar.edu) writes,
Thanks to some feedback I've corrected the archive instructions on how to
build gcc, libgcc and libg++ for VxWorks. To make my life simpler the
patches referenced are no longer included in the vx_cplusplus file. Instead
there are now seperate patch files for the effected parts:
libg++-2.5-src.patch: Patches libg++/src.
libgcc2-2.5.0.patch: Patch libgccc2.c for gcc-2.5.0.
libgcc2-2.5.2.patch: Patch libgcc2.c for gcc-2.5.2.
libio-2.5.patch: Patch the stream library.
See VxWorks Archive information in this FAQ for details on how to
get these files.
---------------------------------------
10. Other C/C++ Compiler tools for VxWorks?
WRS re-sells (re-engineered?) CenterLine cfront product and WindC++
Gateway for CenterLine ObjectCenter. They come with browsers, etc.
Not free.
Wind C++ Gateway for ObjectCenter sold by WRS:
$995 / user 1-4 copies
$875 / user 5-9 copies
Note that this is the cost over and above ObjectCenter.
------------------------------
11. Which cross-debuggers can I use with VxWorks?
GDB & other more expensive tools from WRS, MicroTec Research, etc.
WRS sells a lightly modified version of xxgdb which has a lousy GUI
interface. In 5.1 xvxgdb may have been slightly improved -- but the
ObjectCenter C++ with VxWorks solution provides better GUI interface.
With a little bit of hacking, regular GDB works just fine. Personally,
I find GUI to a debugger gets in the way of real work. I use GNU Emacs
GDB interface which works well and can be easily customized.
There might be some old VxWorks customers that also use VxWorks-aware
dbxtool on Sun machines. This used to be maintained and sold by SUN
Consulting.
If you're only interested in debugging your "application" on VxWorks,
the vxgdb approach (using RPC) works just fine.
If you are rather more interested in the guts of the system as well as
your application you might want to spend some time building
cross-debugging tools from generic GDB distribution into VxWorks.
------------------------------------
12. What are differences between UNIX and VxWorks?
They're both a hack. UNIX has a larger installed base. :-)
Seriously though, similarities end there, IMHO. VxWorks does have a lot of
UNIX "compatible" routines in the user libraries. So porting a UNIX
application is not that hard. But there are enough differences to make such
a port take longer than normally expected.
For one thing, UNIX definitely is not realtime, whatever that means.
[ editorial: To me personally, what realtime means is this -- when there
is a spinning process or task running like crazy doing some stuff
busily, I still want my system to respond immediately when I type a
character on my console keyboard. VxWorks, and other real realtime
OS'es, do this. UNIX and MS-DOG don't. ]
VxWorks in its original form does not have any memory protection support.
It runs in one mode. No protected vs. user mode switching is done. Running
in supervisor mode on most processors, and not using traps for system calls,
VxWorks can achieve minimal overhead on a given piece of hardware than
UNIX. Programming on VxWorks can be more tricky than UNIX for the same
reason.
UNIX provides resource reclamation; by default, VxWorks does not.
[ editorial: using deleteHooks or whatever, you could implement
this on your own.] Instead programmers write what they need as
needed. As a result, the context switch time in VxWorks is on the
order of a few micro-seconds (since there is a lot smaller context to
save and restore). VxWorks does not have full "process";
it only has tasks, or "threads", or light weight processes as some people
like to call them.
Like any other multi-threaded environments (or SMP environments), care
should be taken when writing multi-tasking code. Each routine should be
written carefully to be re-entrant (if it is going to be called from
multiple contexts), semaphores are used a lot for this. And static variables
are frowned upon. Sometimes, when porting a UNIX application, you may need
to add "task variables" for this reason (as done for rpcLib in VxWorks).
VxWorks: minimal interrupt latency (e.g. spl's are quasi-implemented as
semaphores). UNIX: ridiculous interrupt latency (e.g. spl's are implemented
as interrupt lock and unlock calls!).
VxWorks: priority preemption, optional round-robin time-slicing.
Traditional UNIX: prioritized round-robin time-slicing.
Since VxWorks is just a glorified "program" it can be
changed and customized pretty easily. Task scheduling can
be customized as desired, for example. Most people prefer priority based
preemption in the realtime world. UNIX prefers "fair-share time-slicing".
VxWorks networking code, however, is very UNIX compatible [editorial:
it is essentially "ported" version of BSD UNIX TCP/IP code -- tahoe
release ]. It is relatively easy to port socket based code to
VxWorks. [ editorial: except the not-so-compatible hostLib routines, etc.]
VxWorks most definitely is not a "realtime UNIX", or a varient of UNIX as
often misunderstood by some people. The confusion perhaps is due to the
fact that UNIX hosts are used most widely to develop applications for
VxWorks (and VxWorks itself). [ editorial: Realtime UNIX sounds kind of like
Military Intelligence to me. (can you say, oxymoron?) ;-) ]
There are a lot more differences! In short, UNIX is a nice system to run
emacs on. VxWorks is much better at playing pin-ball game machines.
----------------------------
13. What are the performance/benchmark numbers for WIND kernel?
A WRS VxWorks 5.1 Benchmark Report hot off the press:
Benchmark numbers based on: mv167-25Mhz, 5.1
Cache Cache
Key Measurements Enabled Disabled
Raw Context Switch Time 4 us 14 us
Cyclic Test Time 172 us 638 us
Suspend/Switch/Resume/Switch 23 us 86 us
Kernel Timings
Task Related
taskSpawn 124 us 370 us
taskInit 58 us 181 us
taskActivate 12 us 33 us
taskDelete 101 us 303 us
Task Create / Delete 249 us 684 us
taskLock
CASE 1: no lock 3 us 4 us
CASE 2: lock exists 2 us 5 us
taskUnlock
CASE 1: no lock 2 us 12 us
CASE 2: lock exists 5 us 6 us
taskSuspend
CASE 1: ready task 11 us 30 us
CASE 2: pended task 9 us 19 us
CASE 3: suspended task 8 us 19 us
CASE 4: delayed task 9 us 19 us
taskResume
CASE 1: ready task 6 us 19 us
CASE 2: pended task 10 us 19 us
CASE 3: suspended task 13 us 30 us
CASE 4: delayed task 9 us 18 us
Semaphore Related
semBCreate 66 us 152 us
semCCreate 46 us 150 us
semMCreate 45 us 139 us
semDelete
Binary 49 us 157 us
Counting 49 us 163 us
Mutual Exclusion 48 us 157 us
semGive
CASE 1: tasks in queue
Binary 18 us 44 us
Counting 20 us 46 us
Mutual Exclusion 25 us 59 us
CASE 2: no tasks in queue
Binary 4 us 8 us
Counting 5 us 11 us
Mutual Exclusion 6 us 15 us
semTake
CASE 1: semaphore available
Binary 4 us 9 us
Counting 5 us 11 us
Mutual Exclusion 5 us 13 us
CASE 2: semaphore unavailable
Binary 10 us 25 us
Counting 11 us 27 us
Mutual Exclusion 4 us 12 us
Semaphore Give / Take
Binary 7 us 15 us
Counting 9 us 21 us
Mutual Exclusion 10 us 26 us
semFlush
Binary 11 us 20 us
Counting 11 us 20 us
Mutual Exclusion 10 us 16 us
Miscellaneous Operating System Timings
Message Queue Related
msgQCreate 93 us 280 us
msgQDelete 71 us 229 us
msgQSend
CASE 1: task pending 39 us 102 us
CASE 2: no tasks pending 23 us 64 us
CASE 3: queue full 14 us 45 us
msgQReceive
CASE 1: message available 20 us 62 us
CASE 2: message unavailable 15 us 41 us
Memory Related
malloc 28 us 81 us
free 32 us 104 us
Watchdog Related
wdCreate 42 us 106 us
wdDelete
CASE 1: timer started 48 us 160 us
CASE 2: timer not started 44 us 150 us
wdStart
CASE 1: timer in queue 20 us 70 us
CASE 2: no timer in queue 18 us 55 us
wdCancel 11 us 34 us
Floating-Point
robot application 18 sec 51 sec
[ editorial:
If you're anal enough to count pico-seconds in comparing realtime
kernels, you might want to actually get each of the evaluation copies
from various vendors and test them yourself. But remember benchmarks
are misleading and almost always biased and inaccurate. Given similar
benchmark numbers, give or take a few microseconds, etc., your dollars
are better spent in getting something you'll enjoy using. ]
-----------------------------
14. What are the performance/benchmark numbers for VxWorks TCP/IP?
According to WRS, using VxWorks 5.1 on mv167-25mhz (i82596 ethernet)
w/ cache w/o cache enabled
TCP/IP Throughput (KB/sec) 859 KB/sec 682 KB/sec
No numbers available on latency.
Using a reasonably fast processor 25Mhz MC68040 and a reasonably well
made ethernet chip like SONIC or LANCE put together on a reasonable board
design will achieve TCP throughput close to full bandwidth of ethernet.
[ editorial:
This, of course, is rather slow in comparison with other fast
implementations, since a 16Mhz MC68020 with onboard LANCE
or a PeeCee with an ethernet board can easily do the same.
I know at least one implementation based on el-cheapo i486-50mhz/EISA/SONIC
that does: 1170KB/sec. ]
---------------------------------
15. What is the VxSim VxWorks Simulator?
Propaganda from WRS:
It really is VxWorks running under UNIX! So sure it
is not realtime, although all tasks and resources interact
in the same way -- great for prototyping "high-level" code.
Using the simulator saves wear and tear on h/w. It (only)
allows sytem level debugging with native GDB.
Portably written object code compiled for VxSim (for SunOS SPARC)
will usually load without recompilation on a SPARC target. And,
BTW under 5.1 switching from one architecture to anthoer really is
pretty painless.
------------------------------
16. Can I use one boot EPROM for multiple boards on the same net?
WRS provides EPROMs with a default bogus bootline, virtually all
boards come with non-valiatile RAM which is set as soon as the user
fills in his parameters (which include CPU #). Therefore 1 EPROM may
be duplicated and used in all boards at a site. If the board does not
contain nvram then ROMs have to be specially blown, unless a custom
scheme for reading some switches or something is coded to index into a
bootline table. In 5.1 BOOTP is supported -- no more repeated EPROM
burning is necessary.
------------------------------
17. What's the deal with 68881 FPU code in interrupt handlers?
In general, FP context is optimally saved only when the scheduler
notices that the new task coming in also uses the fpu (VX_FP_TASK).
ISRs don't. If no tasks are using the FPU then ISRs may go ahead,
unless different levels of ISRs could interrupt each other and again
cause a protocol violation.
And Stan Schneider says,
You have to set the "VX_FP_TASK" option flag when you spawn your task. You
also need to make sure you don't use the FPU in any interrupt service
routines. Even if your code uses no floating point, some (brain-dead)
compilers save some FPU registers at the start of all routines if there's any
floating point in the file. That's not usually a problem if you're using the
gcc compiler (at least with the "-O" flag on). A sure way to check is via the
dissassembler.
And Leonid Rosenboim says,
This problem is quite common, and really simple to fix, all you have to
do is make sure that all tasks that do a float operation ever, will
be spawned with the VX_FP task option set. This is the best and only
solution. Also, if you run floating operations in ISRs care must be taken,
to call fppSave() and fppRestore(). Also if you are using 5.1 on a 68040,
there is a bug in the compiler that you must work around:
If you write an ISR that uses float instructions, it is not
enougth just to call fppSave()/fppRestore(), since the compiler
for 68040 inserts FP instructions BEFORE your first line
of C code, hence you need to write a dummy ISR that:
dummyIsr()
{
fppSave( .. );
yourRealISR();
fppRestore( ... );
}
And Kent Long says,
This was indeed a real problem in the context switch code in 5.0.x which
was corrected in 5.1.
In both OS versions, there is an optimization that causes the FP context
to be swapped only when the incoming task has been spawned with the
floating point (VX_FP) flag set. In 5.0.x, the copying-in of the FP context
was done via an fppSave() call. This created problems if a new FP
task was created after a previous FP task had been pre-empted by a non-FP
task in the middle of an instruction. The new task ended up with a
mid-instruction context (which causes the protocol violation), and the
old swapped-out FP task ultimately ended up with its context set to IDLE
(which is equally incorrect).
In 5.1, the FP context initialization was changed so that when a task
is created, a pre-defined IDLE frame is copied into that tasks's context.
Since there is no assumption about current FP state (as with fppSave),
task creation is now decoupled from the regular switch logic.
------------------------------
18. Why does ls() not work on netDrv devices?
Because the way directory information retrieval IOCTL calls are not acompatible
between different types of "filesystems" in VxWorks. Another reason why
some think VxWorks filesytem does not exist; they're just a collection of
ioDevice drivers, and there is not a real consistent "design" to it.
The lsOld() should work on "filesystems" that does not support ls().
Chuck Mead proposes the following special routine in case lsOld() does not
work for you:
#include "vxWorks.h"
#include "bootLib.h"
#define RSHD 514
STATUS lsHost(path)
char *path ;
{
char *lsString;
int dataSock ;
int n ;
char nextChar ;
extern BOOT_PARAMS sysBootParams ;
extern char *sysBootHost ;
if (path == (char *) NULL)
{
lsString = (char *) malloc(4) ;
strcpy(lsString, "ls") ;
}
else
{
lsString = (char *) malloc(strlen(path) + 5) ;
sprintf(lsString, "%s%s", "ls ", path) ;
}
dataSock = rcmd (sysBootHost, RSHD, sysBootParams.usr,
sysBootParams.usr, lsString, (int *) NULL) ;
if (dataSock == ERROR)
{
printf("Error opening socket") ;
return (ERROR) ;
}
n = fioRead(dataSock, &nextChar, 1) ;
while (n == 1)
{
printf("%c",nextChar) ;
n = fioRead(dataSock, &nextChar, 1) ;
}
close(dataSock) ;
}
------------------------------
19. Why can't I do ".." at top level directories or NFS mount points?
Because, again, VxWorks does not really have a "filesystem" as most people
understand it. The top level directories are just implemented as device
driver "node", which is used to identify the ioDev associated with the
specific VxWorks "filesystem". Since there is no underlying filesystem
layer, the story ends there. When you're at the top of the directory
hierarchy within a given ioDev/filesytem, you simply cannot do "..".
------------------------------
20. Why do I have trouble using relative symbolic links with NFS?
See [Q: Why can't I do ".." at top level directories or NFS mount points?]
above. This is just another problem caused by the fact that a real filesystem
does not exist for VxWorks. NFS client implementation actually does implement
the symbolic links correctly, using lookup and readlink. The problem is
due to the fact that, for some relative links that use ".." or whatever, that
crosses over filesystems, VxWorks cannot have underlying subsystem that will
handle file pathname to device mapping.
Using absolute symbolic links work just fine (i.e. full path name from top).
------------------------------
21. X for VxWorks
WRS has a product called windX which supports Motif. There is also
libX11 contribution in the VxWorks Archive. This package is perhaps
fairly old and out of date. Essentially, to port X stuff to VxWorks
you'll need to do make sure code is re-entrant everywhere. There is a
"multi-thread" safe version of Xlib available somewhere on the net, one
might try porting that. There are also vendors that have built X servers
using VxWorks. Jupiter Systems, in Alameda, makes high-end X server
machines based on VxWorks. Other X terminal vendors (HP?) also use VxWorks.
-----------------------------
22. IEEE-488 (GPIB) driver for VxWorks
- National Instruments has lots of GPIB stuff
- THEMIS computers has TSVME-409 whic hincludes a GPIB interface.
- APLABS probably has some GPIB stuff too.
-----------------------------
23. How does one disable NFS client caching?
VxWorks caches read and write requests in NFS client code.
To completely disable read and write cache, set nfsCacheSize to 0.
To just flush the write cache as needed, use nfsCacheFlush() or
FIOSYNC ioctl().
------------------------------
24. Why doing a lot of slipInit()/slipDelete() cause routing table corruption?
This is due to a bug in slipDelete() and/or if_dettach(). slipDelete()
calls if_dettach() to clean up after itself (SLIP network interface driver).
Not only is if_dettach() misspelled, it also doesn't do a complete job.
One deficiency is that it does not delete routes that are pointing to the
interface being deleted. This is remedied via another function that deletes
all routes for a give netif device driver. [ ifRouteDelete() ??? ]
slipDelete() does call this routine to delete routes. Another problem is
that if_dettach() does not delete a pointer to the netif device driver
structure in the global in_ifaddr linked list. The in_ifaddr list is
used by the network kernel code to find IP addresses of available network
interfaces, among other things. This lack of proper cleanup turns out to
be a rather hard-to-find memory corruption problem in network code, and
usually manifests itself as routing table corruptions.
To fix this add the following routine, and call it right after calling
slipDelete:
void in_ifaddr_remove(ifp)
struct ifnet *ifp; /* ifp = ifunit("sl0") before slipDelete() called */
{
struct in_ifaddr *ia, *prev_ia;
if (!ifp)
return;
prev_ia = 0;
for (ia = in_ifaddr; ia; ia = ia->ia_next) {
if (ia->ia_ifp == ifp) {
if (prev_ia)
prev_ia->ia_next = ia->ia_next;
else
in_ifaddr = ia->ia_next;
return;
}
prev_ia = ia;
}
}
This, along with the route cleanup, should be incorporated into if_detach().
------------------------------
25. How does one get better network I/O performance?
Most of the overhead is due to socket to network core interface overhead.
The copy that happens between the socket layer and network core code
can be avoided by using the routines in uipc_socket.c (as in BSD tahoe
release code available on various archive sites) and using mbufs directly.
You can also try using raw etherLib routines. However, etherLib also
does copying between user application and network driver.
If you must use the socket interface (sockLib), make sure you tune the
socket level buffers sizes to optimal values using setsockopt() calls
SO_SNDBUF and SO_RCVBUF. You might also just try changing the globals
that control the following default parameters to larger numbers (all
the way upto 48K):
tcp_sendspace (default 4K)
tcp_recvspace (default 4K)
udp_sendspace (default 2K)
udp_recvspace (default 4K)
To get around extra latency in some cases, you might turn on TCP_NODELAY
option on TCP sockets.
------------------------------
26. How does one troubleshoot a backplane driver malfunction?
There are a few rules of thumb:
1) Try the simplest case first -- use polling instead of
bus or mailbox interrupts and software test-and-set
instead of hardware test-and-set. See if this
works first. And then try hardware test-and-set
and then the desired mailbox or bus interrupt.
2) Use bpShow() to see what's up. Also look for magic code
0x1234 in share mem area being used for messages,
and verify heartbeat is being incremented.
At the "anchor" you should see the magic code (4 bytes)
followed by a long word which should be incrementing (the
heartbeat) every second.
3) Verify all memory mapping and make sure there's no
address conflicts on the bus, and the anchor area is
properly set up. If the anchor and ring buffer area
is on a CPU, make sure the sysLib.c:sysHwInit()
does the right thing to allow access to on-board memory
by other CPU's in the chassis. Be careful, as some
VxWorks BSP's turn off on-board memory access by other CPU's
if the CPU is not processor 0. This should be changed
if your anchor CPU is not processor 0 (first CPU in
VME chassis/backplane) -- this is a boot time configuration
parameter [ based on the assumption that bpInit() will be done
by the processor 0 ].
4) Make sure bus controller is functioning properly.
Some combinations of boards might not work well
especially if your system controller board
arbitrates the bus in one way and other boards
expect to be arbitrated in a different way.
Sometimes you might need to use a separate
system controller. Of course, also make sure
you only have one bus master. And that your VME
bus strappings (BREQ, IACK daisychains) are right.
5) Call Wind River's VxWorks tech-support...
------------------------------
27. How do I add select support to my driver?
#include "selectLib.h"
...
xxx_init(...)
{
...
selWakeupListInit(&xxxdev->selwakeupList);
...
}
xxx_ioctl(...)
{
...
switch(request_type) {
...
case FIOSELECT:
selNodeAdd(&xxxdev->selwakeupList,
(SEL_WAKEUP_NODE *)request_arg);
if ((selWakeupType((SEL_WAKEUP_NODE*)request_arg) == SELREAD)
&& readable_condition_is_met)
selWakeup((SEL_WAKEUP_NODE*)request_arg);
if ((selWakeupType((SEL_WAKEUP_NODE*)request_arg) == SELWRITE)
&& writable_condition_is_met)
selWakeup((SEL_WAKEUP_NODE*)request_arg);
break;
...
case FIOUNSELECT:
selNodeDelete(&xxxdev->selWakeupList,
(SEL_WAKEUP_NODE*)request_arg);
break;
...
}
}
And, add calls to selWakeup() as appropriate in your interrupt handlers
and read/write routines as selective conditions are toggled or satisfied.
------------------------------
28. bind() gets EADDRINUSE, how do I fix it?
Fix: do setsockopt() SO_REUSEADDR
------------------------------
29. Common errors in interrupt handlers with floating point co-proc hardware
Don't forget to use:
fppSave()
fppRestore()
Interrupt handler encapsulation code doesn't always save fpp registers for you.
------------------------------
30. Finding entry point of a given module using its name
Example from a poster in vxworks newsgroup (who?):
FUNCPTR start; /* found entry point goes here */
UINT8 symType;
int tid;
if(symFindByName(sysSymTbl,"_nlos_start",(char**)&start,&symType)==OK){
/* taskSpawn(name,priority,options,stacksize,entryAddress,arg1,..) */
tid = taskSpawn("nlos",TASK_PRI_NLOS,SPAWN_OPTS,STACK_SIZE_NLOS,start,
arg1,arg2,.....);
}
------------------------------
31. The problem with irint() in earlier (5.0.2 ?) releases
The problem:
/* Include Files */
#include "vxWorks.h"
#include "math.h"
long irint_count = 0;
sinTest()
{
int sinTable;
while(1)
{
sinTable = irint(sin(4./1024.*(2.*3.14))*10.);
irint_count++;
}
}
% cc68k -I/vxworks/vw/h -c sinTest.c
-> ld < sinTest.o
/* 0x08 Option = VX_FP_TASK within taskLib.h */
-> taskSpawn ("sinTest", 100, 0x08, 4000, sinTest)
/* OR without the Floating Point Option */
-> sp sinTest
-> irint_count
Bus Error
Program Counter: 0xb0ac0124
Status Register: 0x3004
Access Address : 0xb0ac0120
Special Status : 0x01e6
Task: 0xfcb82c "sinTest"
The answer:
Submitted-by wrs!yuba!kent@uunet.uu.net Fri Sep 27 18:55:25 1991
Submitted-by: wrs!yuba!kent@uunet.uu.net (Kent Long)
> In the function irint, there is a bug that sets the floating point
> Exception enable byte register to random values. Here is the
> disasembled code:
>
> _irint:
> 00e034 4e56 0000 LINK .W A6,#0
> 00e038 f227 6b80 FMOVE .X F7,-(A7)
> 00e03c f22e 5780 0008 FMOVE .D ($8,A6),F7
> 00e042 f22e 6380 0008 FMOVE .L F7,($8,A6)
> 00e048 202e 0008 MOVE .L ($8,A6),D0
>
> 00e04c f201 9000 FMOVE .L D1,#<FPCR>
<insert audible groan here>
> 00e050 504f ADDQ .W #8,A7
> 00e052 4e5e UNLK A6
> 00e054 4e75 RTS
>
> Line 0e04c is the line that sets the FPCR to some random value,
> as D1 is unknown going into the function. I rewrote the routine,
> without line 0e4c, and everything works fine.
> If anyone out there knows why this line was put in, I would
> appreciate knowing. Hope this may keep someone else from spending
> a couple of days tracking down this problem.
I have confirmed that this is a bug in all 5.x versions of VxWorks for
the 68k. (In fact, it's in 4.0.2 as well.) As Mark correctly observed,
the problem is that the FPCR register is erroneously being set.
This was a simple cut-and-paste error in the VxWorks source module.
The line which sets the FPCR should instead be restoring the value
of FP7, which was saved on the stack earlier (as you can see in the
code above). So, it would appear that another side effect of this
bug is to clobber FP7.
The fix is pretty simple. The following patch scripts should get things
back to what they should be. (You can just include the appropriate lines
in your startup script, or enter them from the VxWorks shell.)
For VxWorks 5.0.1 and 5.0.2:
pMathPatch = mathHardIrint + 0x18;
*pMathPatch = (short) 0xf21f;
pMathPatch = mathHardIrint + 0x1a;
*pMathPatch = (short) 0x4b80;
This bug does NOT affect VxWorks 5.1. The disassembled code for Vx5.1,
(HK68K/V3D) is:
_mathHardIrint:
2042e58 4e56 0000 LINK .W A6,#0
2042e5c f227 6800 FMOVE .X F0,-(A7)
2042e60 f22e 5400 0008 FMOVE .D (0x8,A6),F0
2042e66 f22e 6000 0008 FMOVE .L F0,(0x8,A6)
2042e6c 202e 0008 MOVE .L (0x8,A6),D0
2042e70 f21f 4800 FMOVE .X (A7)+,F0
2042e74 4e5e UNLK A6
2042e76 4e75 RTS
Kent Long further clarifies,
This was indeed a real problem in the context switch code in 5.0.x which
was corrected in 5.1.
In both OS versions, there is an optimization that causes the FP context
to be swapped only when the incoming task has been spawned with the
floating point (VX_FP) flag set. In 5.0.x, the copying-in of the FP context
was done via an fppSave() call. This created problems if a new FP
task was created after a previous FP task had been pre-empted by a non-FP
task in the middle of an instruction. The new task ended up with a
mid-instruction context (which causes the protocol violation), and the
old swapped-out FP task ultimately ended up with its context set to IDLE
(which is equally incorrect).
In 5.1, the FP context initialization was changed so that when a task
is created, a pre-defined IDLE frame is copied into that tasks's context.
Since there is no assumption about current FP state (as with fppSave),
task creation is now decoupled from the regular switch logic.
------------------------------
32. What are +T, +I thingies in the "i" output?
The following is an excellent description of all these symbols by many people
on the net, including "Fred J. Roeber" and others:
Description Status symbol
===================================== ===============
<blah> and task's priority inherited <blah> + I
Delayed and suspended DELAY+S
Pended and suspended PEND+S
Pended and Delayed PEND+T
Pended, delayed and suspended PEND+S+T
The DELAY state indicates that the task has done some sort of delayed
call while PEND means the task has done something that caused it to
block like trying to semTake a semaphore someone else was holding.
PEND+T means that the task is both delaying and pending; it has done a
semTake with a timeout. +I means that the task has (temporarily)
inherited a higher priority through the use of a mutex semaphore.
The priority inheritance protocol also accounts for the ownership of
more than one mutual exclusion semaphore at a given time. A task in
such a situation will execute at the priority of the highest priority
task blocked on any of the owned resources. The task will return to
its normal, or standard, priority only after relinquishing all of the
mutual exclusion semaphores with the inversion safety option enabled.
If you use nested mutex semaphores with priority inheritance turned on then
when a task inherits a high priority due to some inner semaphore it owns,
it doesn't lose that priority until it relinquishes all the semaphores it
holds. This doesn't quite follow the rules for priority inheritance (to
the extent that there really are any rules) in that normally, a task's
inherited priority should decrease as it releases each nested semaphore to
whatever the priority ceiling is for the semaphores it still holds. Getting
this incremental priority reduction to work right in practice, though,
is extremely difficult (some of the SUN papers on the Solaris real time
scheduling indicate that this was one of the hardest things for SUN to
get right in their OS upgrades). Given that VxWorks is a real time embedded
OS, I, for one, don't care if WRS uses the current implementation even
though it isn't "pure" because the result is a more reliable implementation
that runs more deterministically. Anyway, my guess is that you will find
that you have some nested semaphore code where you are doing something
after releasing one of the nested semaphores that shouldn't be done at a
high priority.
------------------------------
33. Gotchas w.r.t watchdogs
watchdog handlers run at interrupt level. You should not use
routines that can block in interrupt level code. Frequent mistakes:
using printf() in watchdog routines -- use logMsg() instead.
------------------------------
34. Is it possible to delete a memory partition in VxWorks?
No. memPartDestroy() is not really implemented. Perhaps it will
be in the future. Currently it just returns ERROR.
------------------------------
35. rename() does not work in netDrv and nfsDrv filesystems, why?
Because rename() is not implemented for netDrv (although it could be),
and nfsDrv does not implement rename() completely either.
Talk to WRS to get these fixed.
------------------------------
36. Free NFS Server for VxWorks
A free, incomplete, sample implementation (i.e. hack) of NFS Server
for VxWorks is available in:
netcom.com:pub/hjb/nfsd
There is a README file there that describes further details. The current
snapshot of this implementation is a result of a couple of days of
hacking, doesn't do everything right, and intended for educational and
further hacking purpose.
There is someone else who's porting the MS-DOS PC-based nfs server (SOSS?)
to VxWorks. Not clear on its availability yet (let me know!)
------------------------------
37. Free SNMP for VxWorks
hoff@bnlux1.bnl.gov (Lawrence T. Hoff) reports,
We ported the CMU SNMPv2 code to vxWorks 5.1. This latest round of posts has
prompted me to put it in anonymous ftp (ctrldev1.rhic.bnl.gov --
130.199.96.82).
SNMP Research sells VxWorks compatible port of their SNMP implementation
with support. Their's cost $$$$$, though.
------------------------------
38. What third party products are available for VxWorks?
I tried to include the third party products, list of consultants,
services, goodies, etc. available for VxWorks from various sources but...
there are too many to list here. Instead,
the file:
netcom.com:pub/hjb/vxworkers
is updated in realtime to contain a list of individuals and companies
that offer help, services (paid or unpaid), and goods for VxWorks.
To get a copy (if you don't have ftp access) or to be listed in this file,
please contact or send info in ASCII to:
hjb@netcom.com.
------------------------------
39. What kind of products have been developed using VxWorks?
- flight simulators
- radio and optical telescopes
- automative ABS & realtime suspension
- naviation systems
- deep sea instrumentation
- PBXs
- traffic lights
- modems
- sonar systems
[ editorial: And, regrettably, in: ]
- military stuff
---------------------------------
40. A complete list of CPU hardware supported by VxWorks
Complete list of WRS supported BSP's are available in:
netcom.com:pub/hjb/vxbsp
VxWorks runs on a lot of different hardware. Majority of hardware
supported is based on VME bus. Porting VxWorks to a new VME board
based on MC68K takes only a few days, give or take a week, depending
on your karmic condition at the time. A lot of the ports are
initially done by the customers and later "approved" by WRS, for
which they charge, in order to keep them on "supported" list.
Porting to a new "architecture" (new processor) takes longer.
This varies more widely -- from a few months to a few years.
---------------------------------
41. A complete list of peripheral devices supported by VxWorks
Complete list of WRS supported BSP's are available in:
netcom.com:pub/hjb/vxbsp
VxWorks supports a wide variety of devices. A lot of device drivers
are written both by customers and WRS staff. There are device drivers
for almost popular available ethernet chips (except perhaps SEEQ and
Fujitzu, etc.), various serial chips (MC68681 DUART, Zilog 8350 Sync/Async
COMM chip, etc.), little I/O thingies in micro-controllers (MC68302
serial I/O, etc.), SCSI, etc.
Customers of VxWorks, hackers and other hardware vendors (especially
VME) usually have a VxWorks driver for their board. There are drivers
for FDDI boards, GPIB boards, A/D D/A boards, Graphics controllers,
frame grabbers, stepper motors, pin-ball machines, and etch-a-sketch
toy games.
A list of available device driver for VxWorks can be found in:
netcom.com:pub/hjb/vxdrivers
Some evil VxWorkers have drivers for military/weapons systems.
----------------------------------
42. What's with these unbundled "accessories"?
Propaganda from WRS:
The new product/feature doesn't need to wait for the
next OS release. Only the users who want/need it pay for it
lengthens price list which keeps individual items lower
but still enhances WRS revenue growth.
Please Note:
WRS still always adds features to the core product, and
has never taken items out of core product to make them
unbundled. Unlike UNIX vendors and others.
-----------------------------------------
43. How come my 5.0.2 BSP isn't available in 5.1, damn it?
Propaganda from WRS:
WRS tries to give customers 1 year warning when any product
may be discontinued. Unfortunately, all the bugs in
the notification system are still to be worked out.
Complain vehemently to your sales rep. if he didn't
keep you informed. WRS BSP obsoletion policy is primarily
based on BSP volume and h/w avalability.
The 5.1 Guide and Release Notes provide a step by step recipe to
upgrade from 5.0.2 -- minimal changes, start by ANISifying. The BSP
Port Kit 1.1 provides extensive info for the masochist.
----------------------------------------
44. How much is VxWorks?
In general: Not free, in fact, quite the opposite.
- Development License $23.5K (per project?)
- Source $120K.
- Target Licenses from $1000 for single quantity to $10 for 100,000+.
------------------------------
45. What is MicroWorks?
VxWorks is also available as a kernel-only product (MicroWorks 1.0) for
the following processors:
i960, 680x0, 683xx
MicroWorks is -- half the product at a half the price.
It has no network, native debug, shell, or profiling. Comes with
VxMon a very portable ROM monitor to talk with an enhanced vxGDB 2.0
also included -- this is the debug agent which allows true system
level debugging in ISR or wherever. In future, VxWorks may also be
able to work with VxMon.
Development License $12,500.
------------------------------------
46. Other Unbundled Products for VxWorks?
Other unbundled "accessory" products are: VxMP ($4K) which is an
extended shared memory capabilities for the kernel allowing semaphores
and other objects to be manipulated over the backplane transparently
(really!).
VxVMI ($3K) is a library of virtual memory interface routines allowing
text & kernel data protection. complementary products: BSP Port Kit
1.1 ($2K), VxSim 1.0 ($5K), WindX ($3.5K), WindC++ ($2.5K), WindC++
Gateway for ObjectCenter ($?K's), and Realtime Innovations StethoScope (3K).
-----------------------------
47. How can I find out more about VxWorks?
Read: comp.os.vxworks
Email: inquiries@wrs.com
Call: 1-800-KIK-WIND
------------------------------
48. What other net.resources are available on real-time systems?
There is at least one other newsgroup devoted exclusively to a particular
vendor's real-time operating system:
comp.os.os9 Discussions about the OS/9 operating system.
Here are some other related newsgroups:
comp.arch Computer architecture.
comp.arch.bus.vmebus Hardware and software for VMEbus Systems.
comp.os.misc General OS-oriented discussion not carried elsewhere.
comp.realtime Issues related to real-time computing.
comp.os.os9 Issues related to OS9 and OS9000 realtime OS.
There are too many other newsgroups devoted to computer operating systems
to list here. The interested reader is advised to check the "newsgroups"
file on a local news service machine.
The automatic server for users of pSOS RTOS is now in place.
PSOSUSER - A list intended for the discussion of topics relating to
pSOSystem and other products of Integrated Systems Inc.,
Software Components Group.
Send articles to psosuser@isi.com and administrative requests to
listserver@isi.com.
If you aren't already subscribed and would like to, please send a mail
message to listserv@isi.com containing the following in the body of
the message
SUBSCRIBE PSOSUSER <substitute your full name here>
------------------------------
49. How do i use FIONBIO in 5.0.2 when there is no fcntl()?
Use ioctl() instead.
...
{
...
int on = 1; /* turn it on */
...
ioctl(fd, FIONBIO, &on);
...
}
------------------------------
50. Free lex and yacc for use with VxWorks
John Winas (winas@phebos.aps.anl.gov) writes,
I just (moments ago) uploaded the two packages to thor.ncar.ucar.edu where
the vxWorks archive is. When ever the maintainer moves it into the release
area they will be available to everyone. I named the file lexyacc.tar.Z
and it contains all of the sources and make files for you to build them.
It all seems to work perfectly on my sun sparc running 4.1.3. The
only thing you have to configure is the full path name to where you wish
to keep flex so that it can find its skeleton file when you use it to
lexify your .l files. Byacc has no skeleton files and simply needs to
be in your path.
This file is now available in:
epics.aps.anl.gov:/pub/lexyacc.tar.Z
I am interested in any bugs found in because we are using them here. Feel
free to email me at winans@phebos.aps.anl.gov.
------------------------------
51. timer_gettime() bug
From: kent@wrs.com (Kent Long)
In article <9311230139.AA21147@focal.com> bobk@focal.com (Bob Klawuhn) writes:
>I am currently trying to user the timerLib to obtain
>the amount of time that a timer has left before it
>expires. I am trying to use the timer_gettime function.
>The value that it seems to return is always the time
>that the start timer was given, not what is left on the
>timer.
This is indeed a bug in the 5.1 and 5.1.1 VxWorks versions.
It is now being tracked as WRS SPR #2673.
As a workaround, the following could be done following the
timer_gettime() call, to convert the erroneous results into
the desired remainder value:
#include "private/timerLibP.h"
struct timespec timeNow;
(void) clock_gettime (CLOCK_REALTIME, &timeNow);
TV_SUB (timerid->exp.it_value, timeNow);
...which leaves the remainder in it_value.
------------------------------
52. bogus INCLUDE_TCP_DEBUG
From: hipp@wrs.com (Emily Hipp)
>Bus Error
>Program Counter: 0x0001c738
>Status Register: 0x3000
>Access Address : 0xbfbfbfd3
>Special Status : 0x0505
>Task: 0x3dcc54 "tExcTask"
>TCP tracing not enabled (use INCLUDE_TCP_DEBUG).
This is misleading information. INCLUDE_TCP_DEBUG is not supported
as a configAll.h include option.
[ editorial:
INCLUDE_TCP_DEBUG never got integrated into VxWorks config files.
To get around this bug, until WRS fixes it, either unset SO_DEBUG
socket option using getsockopt()/setsockopt(), or call tcpTraceInit() (sp?)
which will drag in tcp_debug.o and set the tcp_trace() routine to
be called when debug option is set on TCP sockets.
]
------------------------------
53. free ppp for VxWorks
Is available via anonymous ftp
netcom.com:pub/peacefulstar/dab/vpppd-1.0.tar.gz
------------------------------
54. how to disable cache on mc68040 or mc68030 using TT regs?
[ From: Steve Morris <morriss@smtplink.indigo.co.il> ]
/**************************/
/* for 68030 (e.g. mv147) */
/**************************/
/* 2 large areas, R/W, cache disabled */
#define TT0_VALUE 0x403f8507 /* from $40000000 -> $77ffffff */
#define TT1_VALUE 0x03018507 /* from $02000000 -> $03ffffff */
test_tt ()
{
register int *pVal;
int ttVal;
pVal = &ttVal;
ttVal = TT0_VALUE;
asm ("pmove %0,tt0" : : "g" (*pVal));
ttVal = TT1_VALUE;
asm ("pmove %0,tt1" : : "g" (*pVal));
}
/**************************/
/* for 68040 (e.g. mv167) */
/**************************/
/* 2 large areas, R/W, cache disabled */
#define TT0_VALUE 0x403f8507 /* from $40000000 -> $77ffffff */
#define TT1_VALUE 0x03018507 /* from $02000000 -> $03ffffff */
test_dtt ()
{
asm ("movec %0,dtt0" : : "r" (DTT0_VALUE));
asm ("movec %0,dtt1" : : "r" (DTT1_VALUE));
}
------------------------------
55. work-arounds for MS-DOS filesystem bug when lseek() past eof
[From: georg@sgl.ists.ca (Georg Feil)]
[editorial: This is a workaround for the bug in VxWorks ms-dos
implementation which produces incorrect error return on write() after
lseek() beyond eof. N.B.: VxWorks versions upto 5.1.1 have buggy IO
system layer that does not support "correct" write() to normal files.
When writing to a file via write() expect to check the return value
even if it is not ERROR. Unlike most other systems (e.g. UNIX) VxWorks
write() upto version 5.1.1 will return number of bytes actually written
even when write() was not completely successful on devices that are
not marked non-blocking and/or are subject to flow control. ]
There's been enough heated debate on this so I'm sending out my brute force
workaround. Thanks to Kent Long who managed to let slip enough information
on the bug to identify the prerequisite: lseek() past the end of file.
My workaround simply extends a file by writing 0's on the end whenever there
is a seek past the end. (This may result in a file being extended when it
shouldn't have been, i.e. no write follows the seek, but what the hell.)
Use file_seek() below instead of lseek() to seek. Note that file_seek() is
not meant to be plug-replaceable with lseek(), that feature is not
required in our system. 'zero8k' is a character array of 8192 zero bytes.
int file_seek(int fd, int offset)
/*
* Sets the byte offset for the next write or read from a file.
* Simple interface to lseek() function. This returns ERR_NONE iff the actual
* actual seek offset returned by lseek() exactly matches the desired offset.
* 'fd' is the file descriptor to seek on.
* 'offset' is the absolute file position to seek to in bytes, where 0 is
* the beginning of file.
* Return value is error code (not a VxWorks error code, another type).
*/
{
STATUS st;
struct stat filestat; /* file status info obtained from fstat() */
int aoff; /* actual seek offset returned by lseek() */
long int fillsz; /* (***) for SPR #2739 kludge */
long int fillamt; /* (***) for SPR #2739 kludge */
if (FileDebug && Verbose>=2) {
wprintw(interact,"file_seek(): seeking to offset %d on fd %d\n",
offset,fd);
}
/* (***) workaround for VxWorks 5.1.1 bug SPR #2739 (write() returns with
transfer count too low but errno not set after seeking past current
end of file). Note that this may extend the file prematurely, i.e.
even if no write() calls follow the seek. */
/* get current file size */
st=fstat(fd, &filestat);
if (st==VX_ERROR) {
if (Verbose>0) {
wprintw(interact,"file_seek(): Error performing fstat() on fd %d: %s\n",
fd, vw_errmsg(0));
}
return(ERR_VXIO);
}
/* manually extend file using zero writes if seek offset past end of file
(note: tried ioctl() with FIOTRUNC, but this only works to shorten
files! */
if (offset>filestat.st_size) {
/* seek to the end of the file first */
errno=0;
aoff=lseek(fd, filestat.st_size, SEEK_SET);
if (aoff != filestat.st_size) {
/* returned value should always match 'filestat.st_size' */
if (Verbose>0) {
wprintw(interact,"file_seek(): Incorrect actual file position after seeking to EOF on fd %d (%d, should be %d) (%s)\n",
fd, aoff, filestat.st_size, vw_errmsg(0));
}
return(ERR_VXIO);
}
/* fill file with zeroes to bring length up to 'offset' */
fillsz=offset-filestat.st_size;
while (fillsz>0) {
if (fillsz>8192)
fillamt=8192;
else
fillamt=fillsz;
errno=0;
aoff=write(fd, zero8k, fillamt);
if (aoff == VX_ERROR) {
if (Verbose>0) {
wprintw(interact,"file_seek(): Error writing zeros to %d at pos %d: %s\n",
fd, ioctl(fd,FIOWHERE,0), vw_errmsg(0));
}
return(ERR_VXIO);
}
if (aoff != fillamt) {
if (Verbose>0) {
wprintw(interact,"file_seek(): Bad xfer count writing zeros to fd %d at pos %d (%d, should be %d): %s\n",
fd, ioctl(fd,FIOWHERE,0), aoff, fillamt, vw_errmsg(0));
}
return(ERR_VXIO);
}
fillsz -= fillamt;
}
/* flush the output to disk immediately */
st=ioctl(fd, FIOFLUSH, 0);
if (st!=VX_OK) {
if (Verbose>0) {
wprintw(interact,"file_seek(): Error flushing zeros written to fd %d at pos %d: %s\n",
fd, ioctl(fd,FIOWHERE,0), vw_errmsg(0));
}
return(ERR_VXIO);
}
}
/* (***) end of workaround for VxWorks 5.1.1 bug SPR #2739 */
errno=0;
aoff=lseek(fd, offset, SEEK_SET);
if (aoff == VX_ERROR) {
if (Verbose>0) {
wprintw(interact,"file_seek(): Error seeking to offset %d on fd %d: %s\n",
offset, fd, vw_errmsg(0));
}
return(ERR_VXIO);
}
/* returned value should always match 'offset' */
if (aoff != offset) {
if (Verbose>0) {
wprintw(interact,"file_seek(): Incorrect actual file position after seeking on fd %d (%d, should be %d) (%s)\n",
fd, aoff, offset, vw_errmsg(0));
}
return(ERR_VXIO);
}
return(ERR_NONE);
}
------------------------------
56. TCL for VxWorks
[From: vanandel@rsf.atd.ucar.edu (Joe Van Andel)]
Tool Command Language, version 7.0 (TCL7.0) for VxWorks 5.1 is
on thor.atd.ucar.edu:~ftp/pub/vx/tclvx7.0.v4.tar.gz
If you've ever been frustrated that the VxWorks shell is not re-entrant,
and has no control flow (e.g. if then else, switch, case ),
then you will find TCL very useful since it is a very complete language,
that allows you to add your own application specific commands to
the interpreter.
I find it invaluable for system testing, since I register TCL commands for
all major functionality of my real-time application. This allows me
to test most pieces of my data acquisition system from a command line,
and build nice flexible scripts to test and operate my system. As a
matter of fact, I can even invoke specific methods of C++ classes via
TCL.
Also, you can control your real-time system from a Unix workstation by
sending TCL commands from either a TCL or Tk/TCL application (via
tclTCP). I find that sending TCL commands (which are just strings) is
much easier and more flexible than writing a Remote Procedure Call
(RPC) for each piece of functionality that I need to remotely invoke.
------------------------------
57. adding default route
A default route is a route table entry with destination field set to 0.
To do the equivalent of "route add default gateway metric" in VxWorks,
do:
routeAdd("0",addr_of_gateway);
------------------------------
58. adjusting network driver MTU size
VxWorks network driver are compatible (mostly) with tahoe BSD drivers.
To change MTU you should modify "if_mtu" field of "struct ifnet" you
pass to ether_attach() or if_attach().
------------------------------
59. tcpdump like utility for vxworks
Take a look at a hacked up packet trace program in:
netcom.com:/pub/hjb/vxsniff.c
[editorial: if you have something better, let me know]
------------------------------
60. VxWorks performance on i960 -- unofficial benchmark
[ From: djanssen@mswe.dnet.ms.philips.nl (Ton Janssen, 62203 (TSSW)) ]
We did some measurements on a Heurikon HK80/V960E.
Equiped with I960CA on 33MHz. Here they are:
Test-item Conditions Time in us
==========================================================================
- semGive/semTake pair (binary semaphore) 11,2
- taskSpawn (+/- 8 processes active) 790,0
- taskIdVerify 0,72
- taskSuspend/taskResume pair (+/- 8 processes active) 32,6
- lstAdd/lstDelete pair (10 nodes in list) 3,9
- msgQNumMsgs 1,2
- msgQReceive (NOWAIT, no message available) 16,8
- rngBufPut/rnBufGet pair (0x20 bytes) 24,5
- msgQSend/msgQReceive pair (NOWAIT, no arguments) 65,7
- bcopy (Quad aligned data) 0,515/Quad
- mutliply two floats (depends on the value!) 1,6
- multiply two doubles ( '' '' ) 2,6
- Raw context switch (8 processes active) 34,0
------------------------------
61. VxWorks SCSI Performance -- unofficial benchmark
[ From: mea@mclean.sparta.com (Mike Anderson) ]
System : Heurikon HK68G/V4D
(33 MHz 68040, 16 MB RAM, NCR53C710 SCSI
w/ Hk SCSI DMA routines in Asynchronous SCSI mode)
VxWorks : 5.1.1 (Yes, using Heurikon VxWorks 5.1 BSP)
Disk : Seagate ST11200N (1 GB SCSI)
File System: VxWorks RAW partition mounted as "/sd1/"
Clock Rate : 60 Hz
Approach:
My application has the data coming in in 16Kbyte chunks. So, I devised
a piece of test code that would allow me to specify how many 16K chunks
I sent to the disk in each write and how many total bytes to write.
The actual number of bytes written is generally a little larger
(typically one more block size) due to the quick and dirty way I wrote
the code, but the calculations are based on the actual number of bytes
written to the disk. The technique I used was to write a block to the
disk starting at the end of the last write and then seek back to
relative zero and write the current pointer (just as I would in real
life to know how many bytes had been streamed total). Also, you
may notice the disk seek time coming into effect in the 200MByte files.
Here are the results:
Buffer Size Total Requested Bytes/sec total secs
16K 1024000 (1 MB) 1,032,192 1.000 secs
10240000 (10 MBs) 1,036,087 9.883 secs
102400000 (100 MBs) 1,049,538 97.566 secs
204800000 (200 MBs) 1,043,123 196.333 secs
32K 1024000 1,613,193 0.650 secs
10240000 1,627,997 6.300 secs
102400000 1,627,980 62.900 secs
204800000 1,610,485 127.166 secs
48K 1024000 1,935,360 0.533 secs
10240000 1,994,712 5.150 secs
102400000 1,992,209 51.416 secs
204800000 1,970,335 103.950 secs
64K 1024000 2,169,467 0.483 secs
10240000 2,244,905 4.583 secs
102400000 2,246,332 45.600 secs
204800000 2,216,450 92.400 secs
96K 1024000 2,495,409 0.433 secs
10240000 2,580,480 4.000 secs
102400000 2,571,534 39.833 secs
204800000 2,533,374 80.866 secs
128K 1024000 2,621,440 0.400 secs
10240000 2,761,250 3.750 secs
102400000 2,771,147 36.983 secs
204800000 2,726,693 75.133 secs
256K 1024000 2,859,752 0.366 secs
10240000 3,130,077 3.350 secs
102400000 3,139,304 32.650 secs
204800000 3,083,428 66.483 secs
512K 1024000 3,145,728 0.333 secs
10240000 3,346,519 3.133 secs
102400000 3,361,846 30.566 secs
204800000 3,298,416 62.150 secs
1024K 1024000 3,311,292 0.316 secs
10240000 3,475,942 3.016 secs
102400000 3,487,345 29.466 secs
204800000 3,416,806 60.150 secs
------------------------------
9999: Contributions to comp.os.vxworks FAQs.
The following net.folks, among others, have contributed to this posting:
Name email address
------------ ----------------------------
Mark Linimon linimon@nominil.lonestar.org
Geoff Espin geoff@wrs.com
Rev. Bob Crispen crispen@foxy.boeing.com
Stan Schneider stan@rti.com
Fred J Roeber fjr@ssd.ray.com
Marc Friedman maf@verdix.com
Joe Van Andel vanandel@ncar.ucar.edu
Bob Marino ram@mr.picker.com
Richard Kowalsky cmdorat@tc.fluke.com
Kent Long kent@wrs.com
James Moore james@wrs.com
Chuck Meade chuckm@verdix.com
Patrick T. Pinkowski ppinkow@jupiter.ksc.nasa.gov
D'Anne Thompson dat@noao.edu
Leonid Rosenboim leonid@rst.hellnet.org
David Lim lim@robotics.jpl.nasa.gov
Richard Neitzel thor@thor.atd.ucar.edu
John Winas winas@phebos.aps.anl.gov
Georg Feil georg@sgl.ists.ca
Steve Morris morriss@smtplink.indigo.co.il
Don Brooks dab@netcom.com
Ton Janssen djanssen@mswe.dnet.ms.philips.nl
I welcome flames, insults, accusations, reactions, additions, and
corrections to this posting via email:
Hwa-Jin Bae
PEACEFUL STAR
hjb@netcom.com
------------------------------
===============================================================================